跳到主要内容

PHP 搭建环境-Docker

概述

因为下学期要学习网络安全,而靶场使用的是 ,所以这里学习一下 的基本语法

搭建环境

参考资料 使用Docker快速搭建开发环境

因为只是临时使用,所以直接使用狗哥说的 Study 或者使用 docket 搭建,洁癖的原因,这里直接使用 Docket来搭建环境

docker pull :7.2-fpm
docker pull nginx
docker pull mysql:5.7
docker pull redis:3.2
# 最后检查一下所有镜像
docker images

然后使用 docker-compose.yml 直接构建

version: "2.1"
services:
nginx:
image: nginx
ports:
- "8081:80"
volumes:
- ./nginx/www:/usr/share/nginx/html
- ./nginx/conf:/etc/nginx/conf.d
- ./nginx/logs:/var/log/nginx
networks:
- -network
:
image: :7.2-fpm
ports:
- "9003:9003"
volumes:
- ./nginx/www:/www
- ./:/usr/local/etc/ # 先生成了容器再复制出来,否则会清空容器的这个目录
# 使用 docker cp 容器ID:/usr/local/etc/ ./ 先复制出来
networks:
- -network
mysql:
image: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: root
MYSQL_ROOT_HOST: '%'
volumes:
- ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
- ./data/mysql/:/var/lib/mysql/
- ./data/init/:/docker-entrypoint-initdb.d/
- ./log/mysql/:/var/log/mysql/
networks:
- -network
networks:
-network:
driver: bridge

然后修改下 nginx 的配置文件

server {
listen 80;
server_name localhost;

location / {
root /usr/share/nginx/html;
index index.html index.htm index.;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

location ~ \.$ {
# fastcgi_pass 对应的是 容器名称
fastcgi_pass :9000;
fastcgi_index index.;
fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name;
include fastcgi_params; # 这里引入
}
}

直接启动 docket-compose

docker-compose up -d

www 文件夹里面创建个 index.

<?
echo info();
?>

然后访问(注意 Windows不能用 80端口,所以需要修改映射)

http://localhost:8081

安装扩展

默认 镜像中提供的扩展比较少,缺少诸如 mysql、gd2 等常用的扩展,这样就需要自己安装并启用扩展。 首先进入到 容器,用 -m 命令查看本地有什么扩展。

然后可以使用 docker--ext-install 命令来安装扩展

docker--ext-install mysql

扩展安装好之后就可以在 .ini 中启用。从 info 中可以看到,容器环境下默认的 .ini 没有启用,可以从 /usr/local/etc/ 下将 .ini-development 拷贝为 .ini。通过修改 .ini 中配置,启用自己需要的扩展。

下面是几个扩展安装的命令

docker--ext-source 在容器中创建一个 /usr/src/ 目录 docker--ext-enable 启用 扩展,省去我们手工编辑 .ini 的过程 docker--ext-install 安装并启用 扩展

docker--ext-configure 经常与 docker--ext-install 搭配,在需要自定义扩展的配置时使用

如下安装 xDebug

参考资料 docker安装 xdebug 扩展

因为 版本与 xcode 版本是对应的,所以需要复制 -i 的结果到 xdebug 里面去分析

# 下载到临时文件夹
curl -L -o /tmp/xdebug-3.0.2.tgz http://xdebug.org/files/xdebug-3.0.2.tgz
# 进入临时文件夹
cd /tmp
# 解压
tar xfz xdebug-3.0.2.tgz
# 移动到扩展文件夹
mv xdebug-3.0.2/ /usr/src//ext/xdebug


# 安装 xdebug
docker--ext-install xdebug
# 启动 xdebug(如果显示目录不存在,创建一个就行了)
docker--ext-enable xdebug

再在生成的 docker--ext-xdebug.ini 文件里面加上这个

;remote_host 可选值
; docker.for.win.localhost
; docker.for.mac.localhost
; host.docker.internal

zend_extension=xdebug.so
xdebug.default_enable=1
xdebug.remote_enable=1
xdebug.remote_host=docker.for.win.localhost
xdebug.remote_port=19000; xdebug的远程端口
xdebug.remote_handler=dbgp
xdebug.remote_connect_back=0
xdebug.idekey=VSCODE
xdebug.remote_cookie_expire_time = 3600
xdebug.remote_autostart=1
xdebug.remote_log=xdebug的日志输出地址,可加可不加
;要注意看日志这个文件有没有权限
xdebug.remote_log=/usr/local//xdebug/remote.log


; -------------------分割线----------------------------

; 上面 v2 版本的,在 v3版本已经改成下面这样
; 具体参考:https://xdebug.org/docs/upgrade_guide
zend_extension=xdebug.so
xdebug.default_enable=1
# xdebug.remote_enable=1
# xdebug.remote_host=你本机的IP地址
xdebug.client_host=host.docker.internal
# xdebug.remote_port=19000; xdebug的远程端口
;避免端口冲突,这里改成 19000,默认是 9000
xdebug.client_port = 19000
xdebug.remote_handler=dbgp
#xdebug.remote_connect_back=1
xdebug.discover_client_host=true
xdebug.mode = debug
xdebug.idekey=VSCODE
#xdebug.remote_autostart=1
xdebug.start_with_request=yes
xdebug.remote_cookie_expire_time = 3600
xdebug.log=/usr/local//xdebug/remote.log

再重启容器,使用 info 打印的页面能显示 xdebug 就行了

配置 vscode

vscode的debug配置

{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Listen for XDebug",
"type": "",
"request": "launch",
"port": 9003,
// "stopOnEntry": true,
"log": true,
"externalConsole": false,
"pathMappings": {
// "容器中对应的项目地址": "本机项目地址" // 绝对路径
"/var/www/html/api": "${workspaceRoot}"
}
},
{
"name": "Launch currently open script",
"type": "",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"port": 9003
}
]
}

Nginx 的 fastcgi

Nginx 的 fastcgi 模块提供了 fastcgi_param 指令主要完成的工作是将 Nginx 中的变量翻译成 中能够理解的变量。

#脚本文件请求的路径,也就是说当访问 127.0.0.1/index. 的时候,需要读取网站根目录下面的 index. 文件,如果没有配置这一配置项时,nginx不会去网站根目录下访问 . 文件,所以返回空白
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_param QUERY_STRING $query_string; #请求的参数;如 ?app=123
fastcgi_param REQUEST_METHOD $request_method; #请求的动作(GET,POST)
fastcgi_param CONTENT_TYPE $content_type; #请求头中的Content-Type字段
fastcgi_param CONTENT_LENGTH $content_length; #请求头中的Content-length字段。

fastcgi_param SCRIPT_NAME $fastcgi_script_name; #脚本名称
fastcgi_param REQUEST_URI $request_uri; #请求的地址不带参数
fastcgi_param DOCUMENT_URI $document_uri; #与$uri相同。
fastcgi_param DOCUMENT_ROOT $document_root; #网站的根目录。在server配置中root指令中指定的值
fastcgi_param SERVER_PROTOCOL $server_protocol; #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

fastcgi_param GATEWAY_INTERFACE CGI/1.1; #cgi 版本
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; #nginx 版本号,可修改、隐藏

fastcgi_param REMOTE_ADDR $remote_addr; #客户端IP
fastcgi_param REMOTE_PORT $remote_port; #客户端端口
fastcgi_param SERVER_ADDR $server_addr; #服务器IP地址
fastcgi_param SERVER_PORT $server_port; #服务器端口
fastcgi_param SERVER_NAME $server_name; #服务器名,域名在server配置中指定的server_name

fastcgi_param PATH_INFO $path_info; #可自定义变量

在 可打印出上面的服务环境变量 如:

echo $_SERVER['REMOTE_ADDR']

使用 Dockerfile 制作镜像

上面的方法还是太麻烦了,可以直接制作一个自己的 镜像,省的还要自己配置插件

创建一个叫做 dockerfile 的文件

# 从官方基础版本构建
FROM :7.2-fpm
# 官方版本默认安装扩展:
# Core, ctype, curl
# date, dom
# fileinfo, filter, ftp
# hash
# iconv
# json
# libxml
# mbstring, mysqlnd
# openssl
# pcre, PDO, pdo_sqlite, Phar, posix
# readline, Reflection, session, SimpleXML, sodium, SPL, sqlite3, standard
# tokenizer
# xml, xmlreader, xmlwriter
# zlib

RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak \
&& echo 'deb http://mirrors.aliyun.com/debian/ buster main non-free contrib' > /etc/apt/sources.list \
&& echo 'deb http://mirrors.aliyun.com/debian-security buster/updates main' >> /etc/apt/sources.list \
&& echo 'deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib' >> /etc/apt/sources.list \
&& echo 'deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib' >> /etc/apt/sources.list \
&& apt-get update \
&& export CFLAGS="$_CFLAGS" CPPFLAGS="$_CPPFLAGS" LDFLAGS="$_LDFLAGS" \
&& apt-get install -y --no-install-recommends libfreetype6-dev libjpeg62-turbo-dev libpng-dev libmagickwand-dev libmcrypt-dev libmemcached-dev zlib1g-dev \
&& rm -rf /var/lib/apt/lists/* \
&& docker--ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker--ext-install -j$(nproc) bcmath calendar exif gettext sockets dba mysqli pcntl pdo_mysql shmop sysvmsg sysvsem sysvshm iconv gd \
&& pecl install imagick-3.4.4 mcrypt-1.0.2 memcached-3.1.3 redis-5.0.2 xdebug-2.7.2 swoole-4.4.3\
&& docker--ext-enable imagick mcrypt memcached redis xdebug swoole \
&& docker--ext-configure opcache --enable-opcache && docker--ext-install opcache

LABEL Author="Stone"
LABEL Version="2019.8"
LABEL Description=" 7.2 开发环境镜像. "

输入

# -t 参数设置镜像名称和标签
docker build -t "my":"7.2" .
# 如果上面的标签没有添加上,可以手动添加
docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)

然后把上面的 docker-compose 改成自己的镜像

# 如果没有装上 xdebug 这里手动再安装一次
pecl install xdebug-2.7.2 # 网络不好多试几次
docker--ext-enable xdebug
# 然后再重新保存为镜像
# 把一个已有的容器保存为一个镜像
docker commit 容器名 新镜像名

再覆盖生成的 docker--ext-xdebug.ini 文件里面加上这个

zend_extension=xdebug.so
xdebug.default_enable=1
xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_port=9003; xdebug的远程端口
xdebug.remote_handler=dbgp
xdebug.remote_connect_back=0
xdebug.idekey=VSCODE
xdebug.remote_cookie_expire_time = 3600
xdebug.remote_autostart=1

复制进去

docker cp docker--ext-xdebug.ini study__1:/usr/local/etc//conf.d/docker--ext-xdebug.ini

重启容器

直接在 WSL2上使用

xdebug 上的配置

zend_extension=xdebug
;xdebug.default_enable=1
;xdebug.client_port = 9001
xdebug.remote_handler=dbgp
xdebug.discover_client_host=true
xdebug.mode = debug
;xdebug.idekey=STORM
xdebug.start_with_request=yes
;xdebug.remote_cookie_expire_time = 3600
;xdebug.log=/usr/local//xdebug/remote.log

在 vscode 的调试配置文件

{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{

"name": "Listen for XDebug",
"type": "",
"request": "launch",
"port": 9003
}
]
}

调试之前需要先启动服务,如下

 -S 0.0.0.0:8080

基本的语法

脚本以 <? 开始,以 ?> 结束:

<!DOCTYPE html>
<html lang="en">
<body>

<h1>My first page</h1>

<?
$x = 5;
$y = 6;
$z = $x + $y;
echo $z;
info();
echo "Hello World!";

echo "Hello World!";
// 这是 单行注释

/*
这是
多行
注释
*/
?>

</body>
</html>